如何将异构 JSON 数组映射到 Java 对象?
How do I map a heterogeneous JSON array to a Java object?
我通过 API 下载了大量历史加密货币市场数据。它的格式如下:
[
[1601510400000,"4.15540000","4.16450000","4.15010000","4.15030000","4483.01000000",1601510459999,"18646.50051400",50,"2943.27000000","12241.83706500","0"],
...
[1609490340000,"4.94020000","4.95970000","4.93880000","4.94950000","5307.62000000",1609490399999,"26280.03711000",98,"3751.46000000","18574.22402400","0"]
]
我认为它是一个数组数组,内部数组包含异构类型(总是以相同的顺序排列相同的类型)。作为一个中间步骤,我已将它保存到文本文件中,但我想读回它并将其映射到这种类型的对象数组中:
public class MinuteCandle {
private long openTime;
private double openValue;
private double highValue;
private double lowValue;
private double closeValue;
private double volume;
private long closeTime;
private double quoteAssetVolume;
private int numberOfTrades;
private double takerBuyBaseAssetVolume;
private double takerBuyQuoteAssetVolume;
private double someGarbageData;
//...
}
我正在使用 Spring 框架和 jackson 库进行 json 映射。这样做可行还是我应该以某种方式手动解析文本?
假设文件中存储的文本有效 JSON,类似于 中的解决方案,可以使用 com.google.gson.Gson
如下:
import com.google.gson.Gson;
import java.io.FileReader;
import java.io.Reader;
public class Main {
public static void main(String[] args) throws Exception {
try (Reader reader = new FileReader("somefile.txt")) {
Gson gson = new Gson();
MinuteCandle[] features = gson.fromJson(reader, MinuteCandle[].class);
}
}
}
我会分两步进行:
- 将 JSON 内容与 Jackson 一起读入
List<Object>
列表。
- 将每个
List<Object>
转换为一个 MinuteCandle
对象
并将这些对象收集到 MinuteCandle
的列表中。
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
File file = new File("example.json");
List<List<Object>> lists = objectMapper.readValue(file, new TypeReference<List<List<Object>>>() {});
List<MinuteCandle> minuteCandles = new ArrayList<>();
for (List<Object> list : lists) {
minuteCandles.add(MinuteCandle.createFromList(list));
}
}
}
从 List<Object>
到 MinuteCandle
的转换(上面的第 2 步)
可以通过在 MinuteCandle
class.
中添加静态方法来实现
public static MinuteCandle createFromList(List<Object> list) {
MinuteCandle m = new MinuteCandle();
m.openTime = (Long) list.get(0);
m.openValue = Double.parseDouble((String) list.get(1));
m.highValue = Double.parseDouble((String) list.get(2));
m.lowValue = Double.parseDouble((String) list.get(3));
m.closeValue = Double.parseDouble((String) list.get(4));
m.volume = Double.parseDouble((String) list.get(5));
m.closeTime = (Long) list.get(6);
m.quoteAssetVolume = Double.parseDouble((String) list.get(7));
m.numberOfTrades = (Integer) list.get(8);
m.takerBuyBaseAssetVolume = Double.parseDouble((String) list.get(9));
m.takerBuyQuoteAssetVolume = Double.parseDouble((String) list.get(10));
m.someGarbageData = Double.parseDouble((String) list.get(11));
return m;
}
使用 JsonFormat 并在您将形状指定为 ARRAY
:
的地方用它注释 class
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
class MinuteCandle
此外,如果您想存储价格,请考虑使用 BigDecimal
而不是 double
。
另请参阅:
我通过 API 下载了大量历史加密货币市场数据。它的格式如下:
[
[1601510400000,"4.15540000","4.16450000","4.15010000","4.15030000","4483.01000000",1601510459999,"18646.50051400",50,"2943.27000000","12241.83706500","0"],
...
[1609490340000,"4.94020000","4.95970000","4.93880000","4.94950000","5307.62000000",1609490399999,"26280.03711000",98,"3751.46000000","18574.22402400","0"]
]
我认为它是一个数组数组,内部数组包含异构类型(总是以相同的顺序排列相同的类型)。作为一个中间步骤,我已将它保存到文本文件中,但我想读回它并将其映射到这种类型的对象数组中:
public class MinuteCandle {
private long openTime;
private double openValue;
private double highValue;
private double lowValue;
private double closeValue;
private double volume;
private long closeTime;
private double quoteAssetVolume;
private int numberOfTrades;
private double takerBuyBaseAssetVolume;
private double takerBuyQuoteAssetVolume;
private double someGarbageData;
//...
}
我正在使用 Spring 框架和 jackson 库进行 json 映射。这样做可行还是我应该以某种方式手动解析文本?
假设文件中存储的文本有效 JSON,类似于 com.google.gson.Gson
如下:
import com.google.gson.Gson;
import java.io.FileReader;
import java.io.Reader;
public class Main {
public static void main(String[] args) throws Exception {
try (Reader reader = new FileReader("somefile.txt")) {
Gson gson = new Gson();
MinuteCandle[] features = gson.fromJson(reader, MinuteCandle[].class);
}
}
}
我会分两步进行:
- 将 JSON 内容与 Jackson 一起读入
List<Object>
列表。 - 将每个
List<Object>
转换为一个MinuteCandle
对象 并将这些对象收集到MinuteCandle
的列表中。
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
File file = new File("example.json");
List<List<Object>> lists = objectMapper.readValue(file, new TypeReference<List<List<Object>>>() {});
List<MinuteCandle> minuteCandles = new ArrayList<>();
for (List<Object> list : lists) {
minuteCandles.add(MinuteCandle.createFromList(list));
}
}
}
从 List<Object>
到 MinuteCandle
的转换(上面的第 2 步)
可以通过在 MinuteCandle
class.
public static MinuteCandle createFromList(List<Object> list) {
MinuteCandle m = new MinuteCandle();
m.openTime = (Long) list.get(0);
m.openValue = Double.parseDouble((String) list.get(1));
m.highValue = Double.parseDouble((String) list.get(2));
m.lowValue = Double.parseDouble((String) list.get(3));
m.closeValue = Double.parseDouble((String) list.get(4));
m.volume = Double.parseDouble((String) list.get(5));
m.closeTime = (Long) list.get(6);
m.quoteAssetVolume = Double.parseDouble((String) list.get(7));
m.numberOfTrades = (Integer) list.get(8);
m.takerBuyBaseAssetVolume = Double.parseDouble((String) list.get(9));
m.takerBuyQuoteAssetVolume = Double.parseDouble((String) list.get(10));
m.someGarbageData = Double.parseDouble((String) list.get(11));
return m;
}
使用 JsonFormat 并在您将形状指定为 ARRAY
:
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
class MinuteCandle
此外,如果您想存储价格,请考虑使用 BigDecimal
而不是 double
。
另请参阅: